package com.binc.testspring.common.utils;

import org.junit.Test;

import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Set;
import java.util.TimeZone;

/**
 * FileName: DateTest   玩玩时间相关的东西
 * Autho: binC
 * Date:  2023/1/14 11:31
 */
public class DateTest {

    @Test
    public void test(){
        String[] availableIDs = TimeZone.getAvailableIDs();
        TimeZone aDefault = TimeZone.getDefault();
        int i  = 0;
        for (String availableID : availableIDs) {
            if (i == 10){
                break;
            }
            System.out.println(availableID);
            i++;
        }
        System.out.println("====================");
        System.out.println("默认:"+aDefault);
        //默认:sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null]
        System.out.println("====================");
        String patternStr = "yyyy-MM-dd HH:mm:ss";

        // 北京时间    new出来的就是默认时区的时间
        Date bjDate = new Date();
        System.out.println("时间戳:"+bjDate.getTime());
        //时间戳:1673667637193

        //得到纽约的时区
        TimeZone newYorkTimeZone = TimeZone.getTimeZone("America/New_York");
        //根据此时区,将北京时间转换成纽约的时间
        SimpleDateFormat newYorkDateFormat = new SimpleDateFormat(patternStr);
        newYorkDateFormat.setTimeZone(newYorkTimeZone);
        System.out.println("北京:"+new SimpleDateFormat(patternStr).format(bjDate));
        System.out.println("纽约:"+newYorkDateFormat.format(bjDate));
        //北京:2023-01-14 11:40:37
        // 纽约:2023-01-13 22:40:37

        //重点: 同一时间戳(时刻),不同时区的时间展示形式不一样,但是时刻是同一个
        // 利用java老版本的date 类库 也能实现时区的转换,关键就是创建不同时区的 simpledateFormat 时间格式化器

        System.out.println("/****************************************/");
        //为什么推荐用java8的时间api ,而不是Date呢
        // 1 如果不格式化,可读性差 ()
        // 2 格式化线程不安全,宝成线程安全好需要使用ThreakLocal包装一层  (如果想简单又想安全的时候,就什么时候用simpleformat对象,就什么时候进行new)
        // 3 拥抱变化,一起使用java8的time api
        // Instant 用的比较多  localDate...等了解就行了
        long now = System.currentTimeMillis();
        // instant 使用的是utc(世界协调时间),不再是GMT(东八区)
        Instant instant = Instant.ofEpochMilli(now);  // time api中就不再是date了,而是instant(瞬时),这个对象的创建用到了时间戳
        Date from = Date.from(instant);
        System.out.println(instant.toEpochMilli());
        System.out.println(from.getTime());
        System.out.println(instant);
        System.out.println(from);
        /*
            1673668629521
            1673668629521
            2023-01-14T03:57:09.521Z   这是UCT世界协调时间    所以比东八区慢八小时
            Sat Jan 14 11:57:09 CST 2023
         */

        System.out.println("==========================");
        System.out.println(LocalDate.now());
        System.out.println(LocalDateTime.now());
        System.out.println(LocalTime.now());
        /**
         * 这三个用的比较少
         * 2023-01-14
         * 2023-01-14T13:53:15.535
         * 13:53:15.535
         */

        System.out.println("-----------------------------");

        System.out.println("=======带时区的时间 ZonedDateTime");
        System.out.println(ZonedDateTime.now());// 使用系统时间 (东8区)
        System.out.println(ZonedDateTime.now(ZoneId.of("America/New_York"))); //自己指定时区   西五区
        System.out.println(ZonedDateTime.now(Clock.systemUTC())); // 自己指定的时区        UCT时间 (0时区)
        /**
         * 2023-01-14T13:57:00.116+08:00[Asia/Shanghai]
         * 2023-01-14T00:57:00.120-05:00[America/New_York]
         * 2023-01-14T05:57:00.126Z
         */

        System.out.println("======offsetDattTime====");
        System.out.println(OffsetDateTime.now());
        System.out.println(OffsetDateTime.now(ZoneId.of("America/New_York")));//自己指定时区   西五区
        System.out.println(OffsetDateTime.now(Clock.systemUTC())); // 自己指定的时区        UCT时间 (0时区)
        /**
         * offsetDattTime 与 zonedDateTime 差不多,只是展示形式上略有区别,  zonedDateTime 只是比offsetDateTime多一个时区信息,别的一摸一样
         *
         * =======带时区的时间 ZonedDateTime
         * 2023-01-14T14:00:50.240+08:00[Asia/Shanghai]
         * 2023-01-14T01:00:50.242-05:00[America/New_York]
         * 2023-01-14T06:00:50.246Z
         * ======offsetDattTime====
         * 2023-01-14T14:00:50.246+08:00
         * 2023-01-14T01:00:50.247-05:00
         * 2023-01-14T06:00:50.247Z
         */

        // 这一段最常用
        System.out.println("======不同时区之间的转换");
        //用instant 接收时间 (db时间戳,前端接口的(String ts))
        Instant current = Instant.now();
        // current = Instant.ofEpochMilli(System.currentTimeMillis());
        ZonedDateTime sydney = ZonedDateTime.ofInstant(current, ZoneId.of("Australia/Sydney"));// 悉尼时间
        ZonedDateTime beijing = ZonedDateTime.ofInstant(current, ZoneId.systemDefault()); // 默认时区     北京时间
        System.out.println(sydney.format(DateTimeFormatter.ofPattern("dd-MM-yy HH:mm:ss"))); // 格式化输出
        System.out.println(beijing.format(DateTimeFormatter.ofPattern("yyyy--MM-dd HH:mm:ss")));
        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        for (String availableZoneId : availableZoneIds) {
            // System.out.println("//////"+availableZoneId);
        }
        /**
         * 14-01-23 17:10:31
         * 2023--01-14 14:10:31
         */

    }



}
